package com.dmai.capacity.platform.config;

import com.dmai.capacity.platform.user.pojo.MailPO;
import com.dmai.capacity.platform.user.service.ISysConfigService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

@Slf4j
@Component
@AllArgsConstructor
public class MailSenderConfig {

    private Map<String, JavaMailSenderImpl> senderMap;

    private final MailProperties mailProperties;

    @Autowired
    private final ISysConfigService configService;

    /**
     * 初始化 sender
     * PostConstruct注解用于需要在依赖注入完成后执行任何初始化的方法。 必须在类投入使用之前调用此方法
     * 因为刚开始我觉得这种方式（@PostConstruct） 不合适，就是没能做到修改了马上就能用的那种感觉。
     * 但是后来写完才发现，其实只要每次添加新的邮件发送人时，都重新初始化一次就可以了。
     * 后来我又用启动事件监听器。@PostConstruct 后来就没去测试了。
     * 理论添加、修改完 调用这个初始化方法就可以了。
     */
//    @PostConstruct
    public void buildMailSender() {
        List<MailPO> mails = configService.findEmails();
        /**
         * 需求：原本就是打算做成一个动态的邮件发送人，因为如果总是用一个邮件发送验证码或者是那种打扰短信，速度一旦太过于频繁，就会造成邮件发送错误。
         * 思路：从数据库中拿到所有可用的邮件发送人，然后封装起来，之后发送邮件时，再进行随机的选择即可。
         * 另外一种方式就是这是动态的。
         * 最后就是加个兜底的，如果数据库中查询不到邮件发送人，我们使用配置文件中的发送邮件的配置。
         */
        if (mails != null && !mails.isEmpty()) {
            mails.forEach(mail -> {
                JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
                javaMailSender.setDefaultEncoding(mail.getDefaultEncoding());
                javaMailSender.setHost(mail.getHost());
                javaMailSender.setPort(mail.getPort());
                javaMailSender.setUsername(mail.getUsername());
                javaMailSender.setPassword(mail.getPassword());
                // 添加数据
                senderMap.put(mail.getTenantId(), javaMailSender);
            });
        } else {
            JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
            javaMailSender.setDefaultEncoding(mailProperties.getDefaultEncoding());
            javaMailSender.setHost(mailProperties.getHost());
            javaMailSender.setPort(mailProperties.getPort());
            javaMailSender.setUsername(mailProperties.getUsername());
            javaMailSender.setPassword(mailProperties.getPassword());
            // 添加数据
            senderMap.put("default", javaMailSender);
        }
    }

    /**
     * 获取MailSender
     *
     * @return CustomMailSender
     */
    public JavaMailSenderImpl getSender(String key) {
        if (senderMap.isEmpty()) {
            buildMailSender();
        }
        return senderMap.get(key);
    }

    /**
     * 清理 sender
     */
    public void clear() {
        senderMap.clear();
    }
}